var aoPostLoadFormCallback = aoPostLoadFormCallback || {}; var aoPostSubmitFormCallback = aoPostSubmitFormCallback || {}; var MAX_FILE_SIZE = 1024 * 1024 * 1024; // 1GB in bytes var DEFAULT_SUPPORTED_FORMATS = []; var ACTON_BASE_URL = "/acton/file-upload-service"; const dropzoneFileCollections = {}; const inputToDropzoneMap = new Map(); var maxUploads = 10; var FILE_SCAN_ERROR_TEXT = "Virus scan failed. File rejected."; var pathname = window.location.pathname; function getErrorIconSVG() { return ''; } function getSuccessIconSVG() { return ''; } function getRemoveIconSvg() { return ''; } function showOrHideSubmitButtons(currentForm) { var submitButtons = !currentForm ? document.querySelectorAll(".ao-form-submit") : currentForm.querySelectorAll(".ao-form-submit"); var hasWarnings; const isProgresBarVisible = document.querySelectorAll("[id^='progress-bar-wrapper']"); const hasVisibleProgressBars = Array.from(isProgresBarVisible).some( (progressBar) => progressBar.style.display === "block" ); for (const dropzoneKey in dropzoneFileCollections) { const dropzone = dropzoneFileCollections[dropzoneKey]; for (const fileStatus of dropzone.fileStatuses) { if (fileStatus.status === "WARNING" || fileStatus.status === "IN_PROGRESS" || hasVisibleProgressBars) { hasWarnings = true; break; } } if (hasWarnings) break; } for (var i = 0; i < submitButtons.length; i++) { if (hasWarnings) { submitButtons[i].disabled = true; submitButtons[i].style.opacity = "0.5"; submitButtons[i].style.pointerEvents = "none"; } else { submitButtons[i].disabled = false; submitButtons[i].style.opacity = "1"; submitButtons[i].style.pointerEvents = "auto"; } } } var removeFileStatus = function(uniqueDropzoneId, fileName) { const dropzoneData = dropzoneFileCollections[uniqueDropzoneId]; dropzoneData.fileStatuses = dropzoneData.fileStatuses.filter(file => file.fileName !== fileName); showOrHideSubmitButtons(); }; const updateFileStatus = (allowMultiple, uniqueDropzoneId, fileName, status, attachmentId, jwtToken) => { const dropzoneData = dropzoneFileCollections[uniqueDropzoneId]; const { fileStatuses } = dropzoneData; if (!allowMultiple) { dropzoneData.fileStatuses = [{ fileName, status, attachmentId, jwtToken}]; } else { const existingFileIndex = fileStatuses.findIndex(file => file.fileName === fileName); if (existingFileIndex !== -1) { fileStatuses[existingFileIndex] = { fileName, status, attachmentId, jwtToken }; } else { fileStatuses.push({ fileName, status, attachmentId, jwtToken}); } dropzoneData.fileStatuses = fileStatuses; } }; function deleteAttachmentByToken(jwtToken, accountId, domain, scheme) { return new Promise((resolve, reject) => { if (!jwtToken) { resolve(false); return; } var url = scheme + domain + ACTON_BASE_URL + "/attachment/delete-by-token?jwtToken=" + jwtToken; const xhr = new XMLHttpRequest(); xhr.open('DELETE', url, true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.onload = function () { if (xhr.status === 200) { try { const response = JSON.parse(xhr.responseText); if (response) { resolve(true); } else { resolve(false); } } catch (e) { resolve(false); } } else { resolve(false); } }; xhr.onerror = function () { resolve(false); }; xhr.send(JSON.stringify(jwtToken)); }); } function updateFileUploadMetadata(uiniqueCollection, index) { const uploadedFiles = uiniqueCollection.fileStatuses .filter(fileStatus => fileStatus.status === "DONE" && fileStatus.attachmentId) .map(fileStatus => ({ name: fileStatus.fileName, id: fileStatus.attachmentId, })); const jsonValue = JSON.stringify({ type: "FILE", data: uploadedFiles, }); const fileUploadMetaData = document.querySelectorAll("[class^='file-upload-metadata']")[index]; if (fileUploadMetaData) { fileUploadMetaData.value = jsonValue; } } function getElementsByAttribute (tagName, index) { return document.querySelectorAll(`[${tagName}]`)[index]?.getAttribute(tagName)?.trim() } function getAllowedFileTypes(accountId, domain, scheme) { return new Promise(function (resolve, reject) { var query = "action=getAllowedFileTypesList&accountId=" + accountId; var url = scheme + domain + "/acton/file/upload.jsp?" + query; var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onload = function () { if (xhr.status >= 200 && xhr.status < 300) { var data = JSON.parse(xhr.responseText); DEFAULT_SUPPORTED_FORMATS = data.allowedFileUploadTypes; resolve(); } else { reject("Error: " + xhr.statusText); } }; xhr.onerror = function () { reject("Network Error"); }; xhr.send(); }); } var _aoFormLoader = (function(w){ var stylesLoaded = false; var captchaLoaded = false; var gfLoaded = false; var htmlId = false; var formsLoadedCount = 0; var formsCount = 0; var scheme = document.location.protocol + "//"; function populateDateField(inputElem, value) { if(!value || !inputElem) { return; } var dateWrapper = inputElem.parentElement; var dateElements = dateWrapper.querySelectorAll('input.ao-form-field-date'); var amPm; if (value.indexOf("AM")) { value = value.replace("AM", ""); amPm = "AM"; } else if (value.indexOf("PM")) { value = value.replace("PM", ""); amPm = "PM"; } var dateFormat = value.split(/[:\/\s]+/); // Populate all date input fields dateElements.forEach(function(elem, index) { elem.value = dateFormat[index] || ''; }); // Populate AM/PM dropdown if(amPm && dateWrapper.querySelector("option[value='" + amPm + "']")) { dateWrapper.querySelector("option[value='" + amPm + "']").selected = true; } } var loadForm = function(options){ formsCount += 1; //increment for each form that is on the page loadStylesheet(options); var previewMarkup = '
Unable to preview form, it has reached the submission cap or expired.
'; var oReq = new XMLHttpRequest(); oReq.onload = function (e) { var response; if (e.target.responseType === 'json') { response = e.target.response || false; } else { response = (e.target.response) ? JSON.parse(e.target.response) : false; } if(!response){ return false; } else if (response && typeof response.processedTemplate === 'undefined' && response.linkURL && response.linkURL != '') { window.location = response.linkURL; return false; } var idArr = options.id.split(":"); htmlId = (options.uniqueId) ? options.id + options.uniqueId : options.id; divId = (options.uniqueId) ? idArr[0] + options.uniqueId : idArr[0]; var existingDiv = document.getElementById('aoform-' + divId); if(existingDiv) existingDiv.parentNode.removeChild(existingDiv); var div = document.createElement('div'); var scriptTag = document.getElementById('aoform-script-' + htmlId); div.id = 'aoform-' + divId; div.style.visibility = "hidden"; scriptTag.parentNode.insertBefore(div, scriptTag); div.innerHTML = response && response.processedTemplate ? response.processedTemplate : previewMarkup; formsLoadedCount += 1; //increment for when a form is loaded onto the page const dropzones = document.querySelectorAll("[id^='files-dropzone']"); const fileInputs = document.querySelectorAll("[id^='file-upload']"); const fileLists = document.querySelectorAll("[id^='filelist']"); getAllowedFileTypes(options.accountId, options.domain, scheme).then(function () { dropzones.forEach((dropzone, index) => { const fileSizeErrorMessage = getElementsByAttribute('data-filesizeerrormessage', index); const fileGeneralErrorMessage = getElementsByAttribute('data-filegeneralerrormessage', index); const fileAllowedTypesErrorMessage = getElementsByAttribute('data-fileallowedtypeserrormsg', index) || 'The uploaded file is not a supported file format'; const fileInput = fileInputs[index]; const fileList = fileLists[index]; const uniqueDropzoneId = `dropzone-${index}`; dropzoneFileCollections[uniqueDropzoneId] = { files: [], fileElementsMap: new Map(), fileStatuses: [], pollingState:{}, fileMessages: { fileSizeErrorMessage, fileGeneralErrorMessage, fileAllowedTypesErrorMessage } }; if (fileInput) { inputToDropzoneMap.set(fileInput, uniqueDropzoneId); } if (dropzone && fileInput && fileList) { const allowedFileTypes = getElementsByAttribute('data-allowedfiletypes', index); const otherFileTypes = getElementsByAttribute('data-otherfiletypes', index); const unqiueCollection = dropzoneFileCollections[uniqueDropzoneId]; unqiueCollection['SUPPORTED_FORMATS'] = DEFAULT_SUPPORTED_FORMATS; if (allowedFileTypes) { var typesArray = allowedFileTypes.split(','); unqiueCollection['SUPPORTED_FORMATS'] = typesArray; } // only keep other file types if specified if (otherFileTypes) { var extensions = otherFileTypes.match(/\w+/g); if( allowedFileTypes) { unqiueCollection['SUPPORTED_FORMATS'] = unqiueCollection['SUPPORTED_FORMATS'].concat(extensions); } else { unqiueCollection['SUPPORTED_FORMATS'] = extensions; } } const defaultMessage = dropzone.querySelector("p"); const allowMultiple = getElementsByAttribute('data-multiple', index) === "true"; fileInput.multiple = allowMultiple; const fileWrapper = document.createElement("div"); fileWrapper.id = "file-wrapper"; if (!(pathname.includes('landingPagePreview') || pathname.includes('showLandingPage'))) { fileWrapper.style.minWidth = "45%"; } fileList.appendChild(fileWrapper); dropzone.addEventListener("dragover", function (event) { event.preventDefault(); }); dropzone.addEventListener('drop', function (event) { event.preventDefault(); const files = Array.from(event.dataTransfer.files); const dataTransfer = new DataTransfer(); files.forEach(file => dataTransfer.items.add(file)); fileInput.files = dataTransfer.files; handleNewFiles(files); validateField(fileInput, { isFileUpload: true }); }); fileInput.addEventListener('change', function () { const files = Array.from(fileInput.files); if (files.length === 0) { return; } const dataTransfer = new DataTransfer(); files.forEach(file => dataTransfer.items.add(file)); fileInput.files = dataTransfer.files; handleNewFiles(files); validateField(fileInput, { isFileUpload: true }); }); function handleNewFiles(files) { const { files: storedFiles, fileElementsMap } = unqiueCollection; if (!allowMultiple) { const newFile = files[0]; if (!newFile) return; const existingFileNames = storedFiles.map(file => file.name); if (existingFileNames.includes(newFile.name)) { return; } unqiueCollection.files = [newFile]; unqiueCollection.fileStatuses = [{ fileName: newFile.name, status: "PENDING" }]; fileElementsMap.clear(); fileWrapper.innerHTML = ""; updateDropzoneContent([newFile]); } else { const existingFileNames = storedFiles.map(file => file.name); const uniqueFiles = files.filter(file => !existingFileNames.includes(file.name)); const remainingSlots = maxUploads - storedFiles.length; if (remainingSlots <= 0) { alert(`You can only upload up to ${maxUploads} files.`); return; } const filesToAdd = uniqueFiles.slice(0, remainingSlots); if (filesToAdd.length === 0) { return; } unqiueCollection.files = mergeFiles(storedFiles, filesToAdd); filesToAdd.forEach(file => { unqiueCollection.fileStatuses.push({ fileName: file.name, status: "PENDING", }); }); updateDropzoneContent(filesToAdd); } updateUploadStatusVisibility(); showOrHideSubmitButtons() } function mergeFiles(existingFiles, newFiles) { const fileMap = new Map(); existingFiles.forEach(file => fileMap.set(file.name, file)); newFiles.forEach(file => { if (!fileMap.has(file.name)) { fileMap.set(file.name, file); } }); return Array.from(fileMap.values()); } function updateDropzoneContent(files) { const { fileElementsMap } = unqiueCollection; if (files.length === 0) { defaultMessage.style.display = "block"; fileList.style.display = "none"; } else { defaultMessage.style.display = "none"; fileList.style.display = "block"; files.forEach(function (file) { if (!fileElementsMap.has(file.name)) { var fileContainer = document.createElement("div"); fileContainer.id = "file-container"; var removeIcon = document.createElement("div"); removeIcon.id = "remove-icon"; removeIcon.innerHTML = getRemoveIconSvg(); var tooltip = document.createElement("div"); tooltip.id = "tooltip"; tooltip.textContent = "Remove file"; var tooltipArrow = document.createElement("div"); tooltip.appendChild(tooltipArrow); removeIcon.addEventListener("click", function () { const { fileStatuses } = unqiueCollection; const fileStatus = fileStatuses.find(f => f.fileName === file.name); if (fileStatus && fileStatus.status === "DONE") { const accountId = options.accountId; const jwtToken = fileStatus.jwtToken; if (jwtToken) { removeIcon.style.disabled = true; removeIcon.style.opacity = "0.7"; removeIcon.style.cursor = "wait"; removeIcon.style.pointerEvents = "none"; deleteAttachmentByToken(jwtToken, accountId, options.domain, scheme) .then((isSuccessful) => { if (isSuccessful) { removeFileLocally(); } else { restoreRemoveIconStyles(); alert("Something went wrong. We couldn’t delete the file. Please try again."); } }) .catch(() => { restoreRemoveIconStyles(); alert("Network error occurred."); }); } else { restoreRemoveIconStyles(); alert("Invalid attachmentId or accountId for removal."); } } else { removeFileLocally(); } function removeFileLocally() { fileWrapper.removeChild(fileContainer); unqiueCollection.files = unqiueCollection.files.filter(storedFile => storedFile.name !== file.name); unqiueCollection.fileStatuses = fileStatuses.filter(f => f.fileName !== file.name); const dataTransfer = new DataTransfer(); unqiueCollection.files.forEach(file => dataTransfer.items.add(file)); fileInput.files = dataTransfer.files; unqiueCollection.fileElementsMap.delete(file.name); if (unqiueCollection.files.length === 0) { const dropzoneElements = document.querySelectorAll("#dropzone-text"); const dropzoneEl = dropzoneElements[index]; dropzoneEl.style.display = "block"; fileList.style.display = "none"; } updateFileUploadMetadata(unqiueCollection, index); removeFileStatus(uniqueDropzoneId, file.name); updateUploadStatusVisibility(); } function restoreRemoveIconStyles() { removeIcon.style.disabled = false; removeIcon.style.opacity = "1"; removeIcon.style.cursor = "pointer"; removeIcon.style.pointerEvents = "auto"; } }); removeIcon.addEventListener("mouseenter", function () { removeIcon.appendChild(tooltip); tooltip.style.left = "50%"; tooltip.style.bottom = `${removeIcon.offsetHeight + 10}px`; tooltip.style.transform = "translateX(-50%)"; tooltip.style.opacity = "1"; tooltip.style.transform = "translate(-50%, 0)"; }); removeIcon.addEventListener("mouseleave", function () { tooltip.style.opacity = "0"; setTimeout(() => { if (tooltip.parentNode === removeIcon) { removeIcon.removeChild(tooltip); } }, 200); }); fileContainer.addEventListener("mouseover", function () { if (progressBarWrapper.style.display !== "block") { removeIcon.style.display = "block"; } }); fileContainer.addEventListener("mouseout", function () { removeIcon.style.display = "none"; }); var fileDetailsWrapper = document.createElement("div"); fileDetailsWrapper.id = "file-details-wrapper"; var fileNameContainer = document.createElement("div"); fileNameContainer.id = "file-name-container"; var fileName = document.createElement("div"); fileName.id = "file-name"; fileName.textContent = shortenFileName(file.name, 12); fileNameContainer.appendChild(fileName); var fileSizeContainer = document.createElement("div"); fileSizeContainer.id = "file-size-container"; var fileSize = document.createElement("div"); fileSize.id = "file-size"; fileSize.textContent = "0 KB of " + (file.size / 1024).toFixed(2) + " KB"; fileSizeContainer.appendChild(fileSize); fileDetailsWrapper.appendChild(fileNameContainer); fileDetailsWrapper.appendChild(fileSizeContainer); var statusWrapper = document.createElement("div"); statusWrapper.id = "status-wrapper"; var progressBarWrapper = document.createElement("div"); progressBarWrapper.id = "progress-bar-wrapper"; var progressBar = document.createElement("div"); progressBar.id = "progress-bar"; var statusIconContainer = document.createElement("div"); statusIconContainer.id = "status-icon-container"; var statusIcon = document.createElement("div"); statusIcon.id = "status-icon"; statusIcon.innerHTML = ""; statusIconContainer.appendChild(statusIcon); var statusMessageContainer = document.createElement("div"); statusMessageContainer.id = "status-message-container"; var statusMessage = document.createElement("div"); statusMessage.id = "status-message"; statusMessage.textContent = ""; statusMessageContainer.appendChild(statusMessage); progressBarWrapper.appendChild(progressBar); statusWrapper.appendChild(progressBarWrapper); statusWrapper.appendChild(statusIconContainer); statusWrapper.appendChild(statusMessageContainer); fileContainer.appendChild(removeIcon); fileContainer.appendChild(fileDetailsWrapper); fileContainer.appendChild(statusWrapper); fileWrapper.appendChild(fileContainer); fileElementsMap.set(file.name, { fileContainer, progressBarWrapper, progressBar, statusMessage, fileSize, statusIcon, }); uploadFile(file, progressBar, statusMessage, fileSize, statusIcon, statusWrapper, fileContainer, removeIcon, progressBarWrapper); } }); } } function shortenFileName(fileName, maxLength) { if (fileName.length <= maxLength) return fileName; var fileExtension = fileName.split('.').pop(); var baseName = fileName.substring(0, maxLength - fileExtension.length - 3); return baseName + "..." + fileExtension; } function checkImageDimensions(file) { const maxPixels = 10000; return new Promise(function(resolve, reject) { createImageBitmap(file).then(function(bitmap) { const width = bitmap.width; const height = bitmap.height; bitmap.close(); resolve({ valid: width <= maxPixels && height <= maxPixels, width: width, height: height }); }).catch(function() { reject(new Error('Failed to read image dimensions')); }); }); } function uploadFile(file, progressBar, statusMessage, fileSize, statusIcon, statusWrapper, fileContainer, removeIcon, progressBarWrapper) { const fileExtension = file.name.split('.').pop().toLowerCase(); const fileGeneralErrorMessage = unqiueCollection.fileMessages.fileGeneralErrorMessage; const fileSizeErrorMessage = unqiueCollection.fileMessages.fileSizeErrorMessage const fileAllowedTypesErrorMessage = unqiueCollection.fileMessages.fileAllowedTypesErrorMessage const imageMaxDimensionsErrorMessage = 'Image dimensions exceed the maximum size of 10,000 pixels' if (file.size > MAX_FILE_SIZE) { statusMessage.textContent = fileSizeErrorMessage; updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "WARNING"); if (fileSizeErrorMessage.length > 52) { fileContainer.style.alignItems = 'baseline'; statusWrapper.style.alignItems = 'baseline'; statusMessage.style.maxWidth = "318px"; } statusIcon.innerHTML = getErrorIconSVG(); showOrHideSubmitButtons(); return; } if (!unqiueCollection['SUPPORTED_FORMATS'].some(el => el && el.includes(fileExtension))) { statusMessage.textContent = fileAllowedTypesErrorMessage; updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "WARNING"); if (fileAllowedTypesErrorMessage.length > 52) { fileContainer.style.alignItems = 'baseline'; statusWrapper.style.alignItems = 'baseline'; statusMessage.style.maxWidth = "318px"; } statusIcon.innerHTML = getErrorIconSVG(); showOrHideSubmitButtons(); return; } const progressStep = 33.33; let currentProgress = 0; let simulatedProgress = 66; let updateInterval; const updateProgress = (targetProgress) => { updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "IN_PROGRESS"); if (updateInterval) clearInterval(updateInterval); updateInterval = setInterval(() => { if (currentProgress < targetProgress) { currentProgress += 0.5; progressBar.style.width = `${currentProgress}%`; fileSize.textContent = `${((currentProgress / 100) * file.size / 1024).toFixed(2)} KB of ${(file.size / 1024).toFixed(2)} KB`; } else { clearInterval(updateInterval); } }, 50); }; const finalizeProgress = (attachmentId, jwtToken) => { clearInterval(updateInterval); progressBar.style.width = "100%"; fileSize.textContent = `${(file.size / 1024).toFixed(2)} KB of ${(file.size / 1024).toFixed(2)} KB`; setTimeout(() => { statusMessage.textContent = "Completed"; statusIcon.innerHTML = getSuccessIconSVG(); progressBarWrapper.style.display = "none"; updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "DONE", attachmentId, jwtToken); updateFileUploadMetadata(unqiueCollection, index); updateUploadStatusVisibility(); showOrHideSubmitButtons(); }, 2000); }; const showError = (message) => { updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "WARNING"); clearInterval(updateInterval); progressBarWrapper.style.display = "none"; statusMessage.textContent = message; statusIcon.innerHTML = getErrorIconSVG(); updateUploadStatusVisibility(); showOrHideSubmitButtons(); }; // 1. Store Request (0–33%) const storeRequest = () => { updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "IN_PROGRESS"); const controller = new AbortController(); const signal = controller.signal; const xhr = new XMLHttpRequest(); var url = scheme + options.domain + ACTON_BASE_URL + "/file-process/"; xhr.open("POST", url, true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.signal = signal; xhr.onload = () => { updateProgress(progressStep); if (xhr.status === 200) { const response = JSON.parse(xhr.responseText); const uploadUrl = response.uploadUrl; uploadToS3(uploadUrl); } else { showError(fileGeneralErrorMessage); controller.abort(); } }; xhr.onerror = () => { showError(fileGeneralErrorMessage); controller.abort(); }; xhr.send( JSON.stringify({ accountId: options.accountId, userId: 1, identifier: options.id.replace(':', '_'), fullFileName: file.name, objectId: options.id.split(":")[0], objectType: "FORM", mimeType: file.type, }) ); }; // 2. Upload to S3 (33–66%) const uploadToS3 = (uploadUrl) => { const controller = new AbortController(); const signal = controller.signal; const xhr = new XMLHttpRequest(); xhr.open("PUT", uploadUrl, true); xhr.setRequestHeader("Content-Type", file.type); xhr.signal = signal; xhr.upload.onprogress = (event) => { if (event.lengthComputable) { const targetProgress = progressStep + (event.loaded / event.total) * progressStep; updateProgress(targetProgress); } }; xhr.onload = () => { if (xhr.status === 200) { confirmUpload(uploadUrl); } else { showError(fileGeneralErrorMessage); controller.abort(); } }; xhr.onerror = () => { showError(fileGeneralErrorMessage); controller.abort(); }; xhr.send(file); }; // 3. Confirm Upload and File-Scan (66–100%) const confirmUpload = (uploadUrl) => { const controller = new AbortController(); const signal = controller.signal; const xhr = new XMLHttpRequest(); var url = scheme + options.domain + ACTON_BASE_URL + "/file-process/confirm"; xhr.open("POST", url, true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.signal = signal; xhr.onload = () => { if (xhr.status === 200) { pollFileStatus(uploadUrl); } else { showError(FILE_SCAN_ERROR_TEXT); controller.abort(); } }; xhr.onerror = () => { showError(FILE_SCAN_ERROR_TEXT); controller.abort(); }; xhr.send(JSON.stringify({ tempUrl: uploadUrl })); }; const handlePollingError = (fileName, dropzoneId, errorMessage, controller) => { const dropzoneState = dropzoneFileCollections[dropzoneId]["pollingState"][fileName]; if (dropzoneState) { dropzoneState.isPolling = false; clearInterval(dropzoneState.interval); } controller.abort(); showError(errorMessage); }; const pollFileStatus = (uploadUrl) => { const controller = new AbortController(); const signal = controller.signal; const pollingIntervalMs = 4000; const maxPollingTimeMs = 1 * 60 * 1000; const maxAttempts = Math.floor(maxPollingTimeMs / pollingIntervalMs); let attemptCount = 0; const pollingState = unqiueCollection["pollingState"]; if (!pollingState[file.name]) { pollingState[file.name] = { isPolling: false, interval: null }; } const dropzoneState = unqiueCollection["pollingState"][file.name]; if (dropzoneState.isPolling) return; dropzoneState.isPolling = true; const startPolling = () => { dropzoneState.interval = setInterval(() => { if (attemptCount >= maxAttempts) { handlePollingError(file.name, uniqueDropzoneId, "Polling timed out. Please try again."); controller.abort(); // Abort the request if polling times out return; } const xhr = new XMLHttpRequest(); var url = scheme + options.domain + ACTON_BASE_URL + "/file-scanning/statuses"; xhr.open("POST", url, true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.signal = signal; xhr.onload = () => { simulatedProgress = Math.min(simulatedProgress + Math.floor(Math.random() * 11), 99); progressBar.style.width = `${simulatedProgress}%`; fileSize.textContent = `${((simulatedProgress / 100) * file.size / 1024).toFixed(2)} KB of ${(file.size / 1024).toFixed(2)} KB`; if (xhr.status === 200) { const response = JSON.parse(xhr.responseText); const statuses = response; if (statuses && statuses.length > 0) { const status = statuses[0]; if (status.status === "IN_PROGRESS") { updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "IN_PROGRESS"); } else if (status.status === "DONE") { if (!(status.attachmentId || status.url)) { pollFileStatus(uploadUrl); } else { dropzoneState.isPolling = false; clearInterval(dropzoneState.interval); finalizeProgress(status.attachmentId, status.jwtToken); } } else if (status.status === "FAILED") { handlePollingError(file.name, uniqueDropzoneId, FILE_SCAN_ERROR_TEXT, controller); } } else { handlePollingError(file.name, uniqueDropzoneId, FILE_SCAN_ERROR_TEXT, controller); } } else { handlePollingError(file.name, uniqueDropzoneId, FILE_SCAN_ERROR_TEXT, controller); } }; xhr.onerror = () => { handlePollingError(file.name, uniqueDropzoneId, FILE_SCAN_ERROR_TEXT, controller); }; xhr.send(JSON.stringify([uploadUrl])); attemptCount++; }, pollingIntervalMs); }; startPolling(); }; if(file.type.startsWith('image/')){ checkImageDimensions(file).then(function(result) { if(!result.valid){ statusMessage.textContent = imageMaxDimensionsErrorMessage; updateFileStatus(allowMultiple, uniqueDropzoneId, file.name, "WARNING"); fileContainer.style.alignItems = 'baseline'; statusWrapper.style.alignItems = 'baseline'; statusMessage.style.maxWidth = "318px"; statusIcon.innerHTML = getErrorIconSVG(); showOrHideSubmitButtons(); return; } else { progressBarWrapper.style.display = "block"; removeIcon.style.display = "none"; storeRequest(); } }) } else { progressBarWrapper.style.display = "block"; removeIcon.style.display = "none"; storeRequest(); } } function updateUploadStatusVisibility() { const uploadStatuses = document.querySelectorAll('#upload-status'); const statusEL = uploadStatuses[index]; const anyInProgress = Array.from(unqiueCollection.fileElementsMap.values()).some( (fileData) => fileData.progressBarWrapper.style.display === "block" ); statusEL.style.display = anyInProgress ? "block" : "none"; } } }); }); if(response.formProperties && ! response.formProperties.invalidDomain){ //Set referrer div.querySelector("input[name='ao_refurl']").value = document.referrer; div.querySelector("input[name='ao_target']").value = window.location.href; div.querySelector("input[name='ao_refemail']").value = getParameterByName("aoRefEmail"); div.querySelector("input[name='ao_campid']").value = getParameterByName("cmpid"); div.querySelector("input[name='ao_gatedpage']").value = getParameterByName("ao_gatedpage"); div.querySelector("input[name='ao_gatedasset']").value = getParameterByName("ao_gatedasset"); var ajaxSubmit = response && response.formProperties && response.formProperties.hasAjaxResponse ? response.formProperties.hasAjaxResponse : false; loadCaptcha(); !!response.formProperties.removeFormTabIndexes ? removeTabIndexes() : updateTabIndexes(); loadGoogleFonts(); formValidationEvents(div, ajaxSubmit); // Form Prefill if ( response.prefill && Object.keys( response.prefill ).length > 0 ) { var fields = Object.keys( response.prefill ); fields.forEach( function( field ) { var input = div.querySelector("input[name='" + field + "']"); var select = div.querySelector("select[name='" + field + "']"); var textarea = div.querySelector("textarea[name='" + field + "']"); if ( ! input && ! select && ! textarea ) { return; } if(input){ if(input.type== "radio"){ var radios = div.querySelectorAll("input[name='" + field + "']"); for(var i = 0; i